#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "include/gestiondetypes.h"



LISTE creer_liste(void)
{
    return NULL;	// une liste vide est un pointeur nul
}

int est_vide(const LISTE L)
{
    return !L;
}

LISTE ajout_tete(const ELEMENT elementdelaliste,LISTE tete)
{
    LISTE p;
    p=(LISTE) calloc(1,sizeof(*p));
    p->element=elementdelaliste;		// la copie marche avec les structures
    p->suivant=tete;	// donc ELEMENT peut être une structure.
    return p;		    // (la copie est la seule action globale utilisable)
}

LISTE supprimer_tete(LISTE L)
{
    if (est_vide(L)) return NULL;
    else
    {
        LISTE p;
        p=L->suivant;
        free(L->element.chaine_lexeme);
        free(L);    // ! ne free pas la chaine allouee dynamiquement
        return p;
    }
}

LISTE ajout_queue(const ELEMENT C,LISTE L)
{
    LISTE p;
    LISTE i=L;
    p=calloc(1, sizeof(*p));
    p->element=C;

    p->suivant=NULL;
    if (est_vide(L))
    {
        return p;
    }
    while (!est_vide(i->suivant))
    {
        i=i->suivant;	//on envoie i à la fin
    }
    i->suivant=p;
    return L;
}


void visualiser_liste(LISTE liste)
{
    LISTE L = liste; // L est le curseur d'une cellule
    while(L!=NULL)//tant que la liste n'est pas vide
    {
        printf("\t %s \t<< %s >>\n",traduire_type_lexeme(L->element.type_de_lexeme), L->element.chaine_lexeme);
        //On affiche les données de la cellule
        L=L->suivant;
    }
}

void initialiser(ELEMENT E)
{
    E.type_de_lexeme=0;
    E.chaine_lexeme=NULL;
}

char* traduire_type_lexeme(TYPE_DE_LEXEME type_a_traduire)
{
    // Attention il doit y avoir conformité avec les types de l'entête
    char* chaine_traduction[] =
    {
        /// TRADUCTION            /// TYPE_DE_LEXEME
        "Commentaire",          //  0
        "Directive",            //  1
        "Erreur de type",       //  2
        "Etiquette",            //  3
        "Minus",                //  4
        "Nouvelle ligne",       //  5
        "Operande",             //  6
        "Operateur",            //  7
        "Parenthese droite",    //  8
        "Parenthese gauche",    //  9
        "Plus",                 // 10
        "Registre",             // 11
        "Symbole",              // 12
        "Valeur_decimale",      // 13
        "Valeur_hexadecimale",  // 14
        "Valeur_octale",        // 15
        "Virgule"               // 16
    };

    if (type_a_traduire>=0 && type_a_traduire<=NOMBRE_TYPES)  // comparer au TYPE_DE_LEXEME min et max (cf source/include/gestiondetypes.h>typedef struct TYPE_DE_LEXEME)
        return chaine_traduction[type_a_traduire];
    printf("Erreur : type %d non traduit\n",type_a_traduire);
    return "Type non traduit";
}
